package finalVersie;

import java.util.Scanner;
import ui.OthelloUserInterface;
import ui.UserInterfaceFactory;
import ui.Event;
import java.io.*;

public class Orthello {

	OthelloUserInterface ui;
	private Spel spel;
	private final static int HOOGTE = OthelloUserInterface.AANTAL_KOLOMMEN;
	private final static int BREEDTE= OthelloUserInterface.AANTAL_RIJEN;
	private final static int MAX_AANTAL_BEURTEN = HOOGTE*BREEDTE*2;
	PrintStream out;

	Orthello(){
		UserInterfaceFactory.zetLageResolutie(true);
		spel = new Spel(HOOGTE,BREEDTE,MAX_AANTAL_BEURTEN);
		ui = UserInterfaceFactory.geefOthelloUI();
		out = new PrintStream(System.out);

	}

	public static void main(String[] argv) {
		new Orthello().start();
	}

	public void start(){
		laatBordZien(spel.geefBord());
		spel.zetTijd();
		while(spel.doorgaan()){
			wachtOpInvoer();
		}
		String winnaar = spel.bepaalWinnaar();
		ui.wisStatusBalk();
		ui.printf("Het spel is afgelopen.\n %s heeft gewonnen!", winnaar);
		slaSpelOp();
	}

	public void slaSpelOp(){
		String fileName = "spel.txt";
		PrintStream fileOut;
		try {
			File file = new File(fileName);
			fileOut = new PrintStream(file);
			for(int i = 0; i < spel.geefBeurtNummer(); i++){
				fileOut.printf(spel.schrijfBeurtCode(i));
			}
		}
		catch (FileNotFoundException Exception) {
				out.printf("De file %s kan niet worden geopend", fileName);
				System.exit(1);
			}
	}

	public Coordinaat leesCoordinaat(char letter,int cijfer){
		letter -= 'a';
		return new Coordinaat(letter,cijfer -1);
	}


	public void plaatsDoorzichtig(CoordinaatRij coordinaatRij,int kleur){
		for(int i = 0;i<coordinaatRij.geefAantalCoordinaten();i++){
			ui.plaatsDoorzichtig(coordinaatRij.geefCoordinaten()[i].geefX(), coordinaatRij.geefCoordinaten()[i].geefY(), kleur);
		}
		ui.toon();
	}


	public void wachtOpInvoer(){
		Event event = ui.geefEvent();
		verwerkEvent(event);

	}

	public void verwerkEvent(Event event){
		if(event.naam.equals("letter")) 			verwerkLetter(event); /* Als vervanging voor alt_cijfer*/
		else if (event.naam.equals("cijfer"))		verwerkCijfer(event);
		else if (event.naam.equals("klik"))			verwerkKlik(event);
		else if (event.naam.equals("mouseover"))	verwerkMouseover(event);
		else if (event.naam.equals("pas"))			verwerkPas();

	}

	public void verwerkPas(){
		if(spel.checkMogelijkeZetten().geefAantalCoordinaten() == 0){
			spel.doePas();
		} else{
			String mededeling = new String("Je kan nu niet passen, er zijn zetten mogelijk.\n");
			plaatsMededeling(mededeling);
		}
	}

	public void verwerkKlik(Event event){
		Scanner klikScanner = new Scanner(event.data);
		Coordinaat coordinaat = leesCoordinaat(klikScanner.next().charAt(0),klikScanner.nextInt());
		if(spel.checkMogelijkeZetten().checkOfInRij(coordinaat)){
			String mededelingNaZet = new String(spel.doeZet(coordinaat));
			laatBordZien(spel.geefBord(),mededelingNaZet);
		}
	}

	public void verwerkLetter(Event event){
		if (event.data.equals("z") && spel.geefBeurtNummer() > 0){
			spel.gaZetTerug();
			laatBordZien(spel.geefBord());
		}
	}

	public void verwerkMouseover(Event event){
		Scanner klik = new Scanner(event.data);
		Coordinaat coordinaat = leesCoordinaat(klik.next().charAt(0),klik.nextInt());
		laatBordZien(spel.geefBord());
		CoordinaatRij mogelijkeSlagen = spel.checkTussenliggendeStenen(coordinaat, spel.geefKleur());
		plaatsOmcirkeling(mogelijkeSlagen);
	}

	public void verwerkCijfer(Event event){
		if(spel.geefBeurtNummer() - Integer.parseInt(event.data) >= 0){
			for(int i = 0;i<Integer.parseInt(event.data);i++){
				spel.gaZetTerug();
			}
		} else {
			while(spel.geefBeurtNummer() > 0){
				spel.gaZetTerug();
			}
		}
		laatBordZien(spel.geefBord());
	}

	public void plaatsOmcirkeling(CoordinaatRij coordinaatRij){
		for(int i = 0;i<coordinaatRij.geefAantalCoordinaten();i++){
			ui.plaatsOmcirkeling(coordinaatRij.geefCoordinaten()[i].geefX(),coordinaatRij.geefCoordinaten()[i].geefY());
		}
		ui.toon();
	}

	public void laatBordZien(Bord bord){
		ui.maakLeeg();
		for(int i = 0;i < bord.geefLengte();i++){
			for(int j = 0;j < bord.geefHoogte();j++){
				ui.plaats(i, j, bord.geefWaarde(i, j));
			}
		}
		ui.wisStatusBalk();
		String mededeling = new String("Huidige beurt: " + spel.geefBeurtNummer() + ", " + spel.geefSpelerNaam() +" is aan zet.");
		plaatsMededeling(mededeling);
		plaatsDoorzichtig(spel.checkMogelijkeZetten(),spel.geefKleur());
		ui.toon();
	}

	public void laatBordZien(Bord bord,String mededelingNaZet){
		ui.maakLeeg();
		for(int i = 0;i < bord.geefLengte();i++){
			for(int j = 0;j < bord.geefHoogte();j++){
				ui.plaats(i, j, bord.geefWaarde(i, j));
			}
		}
		plaatsDoorzichtig(spel.checkMogelijkeZetten(),spel.geefKleur());
		String mededeling = new String(mededelingNaZet + "Huidige beurt: " + spel.geefBeurtNummer() + ", " + spel.geefSpelerNaam() +" is aan zet.");
		plaatsMededeling(mededeling);
		ui.toon();
	}

	public void plaatsMededeling(String mededeling){
		ui.wisStatusBalk();
		ui.printf("%s", mededeling);
	}


}
